package com.cskayan.javase.object._6clone;

/**
 * 空接口的作用
 * 回顾一个关键字instanceof
 *      引用 instanceof 类名/接口名
 *      判断,引用所指向的对象是否是后面类名的对象或者子类对象
 *          当然如果是接口或者抽象类,只能判断是否是子类对象
 *
 * 思考:
 *      一个类如果实现了一个空接口,确实是不会得到新成员的
 *      但是这个类有什么变化呢?从数据类型的角度
 *      变化是 --> 从原先不是子类,变成了子类
 *
 * 于是配合instanceof关键字
 *      就可以用于判断一个引用所指向的对象是否是空接口的子类对象
 *      如果是,就可以做一些操作
 *      如果不是,也可以做一些操作
 *
 * 实际上,Java中的clone方法实现Cloneable接口与否,然后抛出异常这种操作的实现,就是依赖于instanceof方法
 *
 * 以上,总结:
 *      空接口其实起着一种标记的作用
 *      这种接口称之为"标记接口"
 *      在java中标记接口有很多,往往都是实现了它们允许做一些操作.
 *
 *
 * @since 11:24
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo2 {
    public static void main(String[] args) {
        judgeImplEmptyInterface(new A());
        judgeImplEmptyInterface(new B());


    }

    /**
     * 用于判断一个对象是否实现空接口
     *      如果实现了,就做一些操作
     *      如果没实现,就抛出异常
     *
     * @author wuguidong@cskaoyan.onaliyun.com
     * @since 2022/04/06 11:29
     */
    public static void judgeImplEmptyInterface(Object o) {
        if (o instanceof EmptyInterface){
            // 实现了
            System.out.println("实现了空接口,允许做操作,比如允许克隆对象!");
            return;
        }
        // 没有实现空接口
        System.out.println("没有实现空接口,不允许做操作,比如禁止克隆,抛出CloneNotSupportException!");
    }
}

interface EmptyInterface {
}

class A {
}
class B implements EmptyInterface{}